﻿using System;
using System.Collections.Generic;
using System.Linq;
using Onshi.POS.Contabilidad.Vistas;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Repositorios;

namespace Onshi.POS.Contabilidad
{
    public class CuentasContablesAbmPresentador
    {
        #region Atributos
        private ICuentaContableAbm vista;
        private List<CuentaContable> lista;
        #endregion  

        #region Constructor
        public CuentasContablesAbmPresentador(ICuentaContableAbm vista):base()
        {
            this.vista = vista;
        }
        #endregion
        
        #region Propiedades
        private RepositorioCuentasContables RepositorioCuentasContables
        {
            get { return new RepositorioCuentasContables(); }
        }

        private RepositorioTiposCuentasContables RepositorioTiposCuentasContables
        {
            get { return new RepositorioTiposCuentasContables(); }
        }
        #endregion

        #region Metodos
        private void ActualizarLista()
        {
            lista = RepositorioCuentasContables.DevolverTodos();
            vista.Lista = lista;
        }

        private void Guardar()
        {
            var cuentaContable = new CuentaContable();
            cuentaContable.TipoCuentaContable = RepositorioTiposCuentasContables.DevolverPorId(vista.IdTipoCuentaContable);
            if (cuentaContable.TipoCuentaContable == null)
                throw new Exception("El Tipo Cuenta seleccionado no existe");
            cuentaContable.Id = vista.IdCuentaContable;
            cuentaContable.Nombre = vista.Nombre;
            cuentaContable.Activo = vista.Activo;
            switch (vista.EstadoAbm)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    RepositorioCuentasContables.Insertar(cuentaContable);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    RepositorioCuentasContables.Modificar(cuentaContable);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.BAJA:
                    RepositorioCuentasContables.Eliminar(cuentaContable);
                    break;
            }
            ActualizarGrilla();
        }

        public void Aceptar()
        {
            Guardar();
        }

        public void Eliminar()
        {
            Guardar();
        }

        public void ActualizarGrilla()
        {
            ActualizarLista();
            Filtrar();
        }

        public void Filtrar()
        {
            if (lista != null && (vista.NombreFiltro != String.Empty
                | vista.IdTipoCuentaContableFiltro != 0))
            {

                var consulta = (from CuentaContable item in lista
                                where item.Nombre.ToLower().Contains(vista.NombreFiltro)
                                & (vista.IdTipoCuentaContableFiltro == 0 ? item.TipoCuentaContable.Id == item.TipoCuentaContable.Id : item.TipoCuentaContable.Id == vista.IdTipoCuentaContableFiltro)
                                select item);
                vista.Lista = consulta.ToList();
            }
            else
            {
                vista.Lista = lista;
            }
        }

        #endregion
    }
}
